package com.algorithm.liyc.practice;

/**
 * 螺旋矩阵II
 * 给定一个正整数 n，生成一个包含 1 到 n^2 所有元素，且元素按顺时针顺序螺旋排列的正方形矩阵。
 * 左开右闭
 * @author Liyc
 * @date 2023/11/22 16:37
 **/

public class Solution5 {
    public int[][] generateMatrix(int n) {
        int[][] result = new int[n][n];
        int count = 1;//赋值
        int loop = 0;//循环圈数
        int startx = 0;//每圈循环起点
        int offer = 1;//左开右闭
        int i,j;
        while (loop++ < n / 2) {// 判断边界后，loop从1开始
            // 模拟上侧从左到右
            for (j = startx; j < n-offer; j++) {
                result[startx][j] = count++;
            }
            // 模拟右侧从上到下
            for (i = startx; i < n-offer; i++) {
                result[i][j] = count++;
            }
            // 模拟下侧从右到左
            for (;j >= offer;j--) {
                result[i][j] = count++;
            }
            // 模拟左侧从下到上
            for (;i>=offer;i--) {
                result[i][startx] = count++;
            }
            startx++;
            // offer 控制每一圈里每一条边遍历的长度
            offer++;
            // 如果n为奇数的话，需要单独给矩阵最中间的位置赋值
            if (n % 2 == 1) {
                result[startx][startx] = count;
            }
        }
        return result;
    }
}
